///****************************************
// * Copyright (c) 2015 NiuWa.
// * All rights reserved.
// * Created on 2015年4月15日
// * 
// * Contributors:
// * 	   Percy.Lo - initial implementation
// ****************************************/
//package com.niuwa.p2p.service.exchange;
//
//
//import java.util.List;
//import java.util.Map;
//
//import com.niuwa.p2p.core.enums.MongoQueueEnum;
///**
// * @title 借款债权项目和资金匹配服务
// *
// * @author Percy.Lo
// * @version 1.0
// * @created 2015年4月15日
// */
//public interface IMatchService {
//
//	// TODO 交易相关review - 债权匹配，接口列表
//	
//	/**
//	 * 匹配(项目和资金按规则匹配)
//	 * 
//	 * @param targetQueue
//	 *            指定队列中查找，例如queueLoanApp、queueLoanChannel、queueLoanTransfer，
//	 *            如果为null表示所有借款队列都扫描（一般定时调度传入null）
//	 */
//	public void allQueueMatch(MongoQueueEnum targetQueue) throws Exception;
//
//	/**
//	 * 调取资金（直投产品调取资金）,项目不进队列，只做一次性匹配。[不添加到队列，同步匹配返回结果]
//	 * @param loanUserId 借款人Id
//	 * @param loanId 借款项目Id
//	 * @param amount 调取资金的额度
//	 * @param productVersion 产品版本号
//	 * @param productCode 产品代码
//	 * @param surplusAmount 剩余可投金额
//	 * @param projectAmount 该笔借款额度或渠道存量债权余额
//	 * @param investorCount 目前投资人数
//	 * @return true-调取成功，false-调取失败
//	 */
//	public boolean gatheringFoundForDirect(String loanUserId, String loanId, String amount, String productVersion, String productCode, String surplusAmount, String projectAmount, String investorCount);
//
//	/**
//	 * 调取资金（自转债权调取资金）,项目不进队列，只做一次性匹配。[不添加到队列，同步匹配返回结果]
//	 * @param loanUserId 出让人Id
//	 * @param loanId 借款项目Id
//	 * @param amount 调取资金的额度（债权金额）
//	 * @param productVersion 产品版本号
//	 * @param productCode 债权转让产品的代码
//	 * @param surplusAmount 剩余可投金额
//	 * @param projectAmount 自转产品的的债权金额
//	 * @param investorCount 目前投资人数
//	 * @param srcCreditNo 出让人债权编号
//	 * @param price 转让债权价格
//	 * @param serialNo 债权转让申请编号 
//	 * @param recordNo 债权转让者的投资记录id
//	 * @param creditVersion 转让债权的版本号，防止同时有还款操作 
//	 * @return true-调取成功，false-调取失败
//	 */
//	public boolean gatheringFoundForTransfer(String loanUserId, String loanId, String amount, String productVersion, String productCode, String surplusAmount, String projectAmount, String investorCount, String srcCreditNo, String price, String serialNo, String recordNo, String creditVersion);
//
//	/**
//	 * 添加借款项目到队列（app端借款，审批系统审核通过时使用）[同步添加至队列，异步匹配]
//	 * 
//	 * @param map ->{user_id-借款人Id,_id-项目编号,loan_amount-借款金额,version-版本号}
//	 */
//	public boolean doAddLoanApp(Map<String, String> map);
//
//	/**
//	 * 添加借款项目到队列（投资计划债权转让时）[同步添加至队列，异步匹配]
//	 * 
//	 * @param map ->{user_id-债权持有人Id,_id-债权转让申请编号,loan_amount-债权转让金额,version-债权转让申请版本号,projectNo-债权转让的项目编号,recordNo-债权转让者的投资编号,
//	 *               creditNo-债权转让的债权编号,creditVersion-债权转让的用户债权版本号,productCode-转让人的投资产品代码,productName-转让人的投资产品名称}
//	 */
//	public boolean doAddLoanTransfer(Map<String, String> map);
//	
//	/**
//	 * 添加借款项目到队列（交易系统-后台匹配功能使用）。[同步添加至队列，异步匹配]
//	 * 
//	 * @param list -> map ->{user_id-借款人或借款企业Id,_id-项目编号, loan_amount-借款金额或存量债权余额+平台服务费,version-版本号}
//	 */
//	public boolean doAddLoan(List<Map<String, String>> list);
//
//	/**
//	 * 添加资金到队列（web端购买投资计划时）。[同步添加至队列]
//	 * 
//	 * @param map
//	 *            ->{user_id-投资人Id,_id-投资记录编号, invest_amount-投资金额,
//	 *            invest_surplus_amount-剩余投资金额, version-版本号}
//	 */
//	public boolean doAddFund(Map<String, String> map);
//	
//	
//	/**
//	 * 添加资金到队列（项目还款时判断对应的债权的资金来源为投资计划，则触发再次添加到资金队列）。[同步添加至队列]
//	 * 
//	 * @param map
//	 *            ->{user_id-投资人Id,_id-投资记录编号, invest_amount-投资金额,
//	 *            invest_surplus_amount-剩余投资金额, version-版本号}
//	 */
//	public  boolean doAddFundByRepayment(Map<String, String> map);
//	
//	/**
//	 * 添加资金到队列（项目流标时判断对应的资金来源为投资计划，则触发再次添加到资金队列）。[同步添加至队列]
//	 * 
//	 * @param map
//	 *            ->{user_id-投资人Id,_id-投资记录编号, invest_amount-投资金额,
//	 *            invest_surplus_amount-剩余投资金额, version-版本号}
//	 */
//	public  boolean doAddFundByBidFailure(Map<String, String> map);
//	
//	/**
//	 * 锁定资金（投资计划-自动转让申请时使用）
//	 * @param pecordNo 投资记录编号
//	 */
//	public boolean doLockFund(String pecordNo);
//
//	/**
//	 * 同步mongoDB与mysqlDB的对应的所有借款队列和资金队列（外部调度任务晚上做一次即可）
//	 */
//	public boolean syncAllQueue();
//
//}